From 2a9204bf9c0aaadf64434e8b45da9bb5a1784ee1 Mon Sep 17 00:00:00 2001 From: Ian Campbell Date: Wed, 18 Feb 2015 17:01:55 +0000 Subject: [PATCH] xen: arm64: more useful logging on bad trap. Dump the register state before panicing so we have some clue where the issue occurred. Also decode the ESR register a bit to save having to grab a pen and paper. ESR_EL2 is a 32-bit register, so use SYSREG_READ32 not ..._READ64, as we already do correctly in the main trap handler. While here notice that do_trap_serror is never called and remove it. Signed-off-by: Ian Campbell Reviewed-by: Julien Grall Tested-by: Jintack Lim Cc: jintack@cs.columbia.edu [ ijc -- add missing \n to first printk ] --- xen/arch/arm/arm64/traps.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/xen/arch/arm/arm64/traps.c b/xen/arch/arm/arm64/traps.c index 1693b5d3fb..5a90cfa9a6 100644 --- a/xen/arch/arm/arm64/traps.c +++ b/xen/arch/arm/arm64/traps.c @@ -24,11 +24,6 @@ #include -asmlinkage void do_trap_serror(struct cpu_user_regs *regs) -{ - panic("Unhandled serror trap"); -} - static const char *handler[]= { "Synchronous Abort", "IRQ", @@ -38,11 +33,14 @@ static const char *handler[]= { asmlinkage void do_bad_mode(struct cpu_user_regs *regs, int reason) { - uint64_t esr = READ_SYSREG64(ESR_EL2); - printk("Bad mode in %s handler detected, code 0x%08"PRIx64"\n", - handler[reason], esr); + union hsr hsr = { .bits = READ_SYSREG32(ESR_EL2) }; + + printk("Bad mode in %s handler detected\n", handler[reason]); + printk("ESR=0x%08"PRIx32": EC=%"PRIx32", IL=%"PRIx32", ISS=%"PRIx32"\n", + hsr.bits, hsr.ec, hsr.len, hsr.iss); local_irq_disable(); + show_execution_state(regs); panic("bad mode"); } -- 2.30.2